home *** CD-ROM | disk | FTP | other *** search
/ Amiga Magazin: Amiga-CD 1997 September & October / Amiga-CD 1997 #9-10.iso / aminet / gameboyemulator / codesed.h < prev    next >
C/C++ Source or Header  |  1995-10-29  |  5KB  |  172 lines

  1. /** VGB: portable GameBoy emulator ***************************/
  2. /**                                                         **/
  3. /**                         CodesED.h                       **/
  4. /**                                                         **/
  5. /** This file contains implementation for the ED table of   **/
  6. /** Z80 commands. It is included from Z80.c.                **/
  7. /**                                                         **/
  8. /** Copyright (C) Marat Fayzullin 1994,1995                 **/
  9. /**     You are not allowed to distribute this software     **/
  10. /**     commercially. Please, notify me, if you make any    **/
  11. /**     changes to this file.                               **/
  12. /*************************************************************/
  13.  
  14. case ADC_HL_BC: M_ADCW(BC);break;
  15. case ADC_HL_DE: M_ADCW(DE);break;
  16. case ADC_HL_HL: M_ADCW(HL);break;
  17. case ADC_HL_SP: M_ADCW(SP);break;
  18.  
  19. case SBC_HL_BC: M_SBCW(BC);break;
  20. case SBC_HL_DE: M_SBCW(DE);break;
  21. case SBC_HL_HL: M_SBCW(HL);break;
  22. case SBC_HL_SP: M_SBCW(SP);break;
  23.  
  24. case LD_xWORDe_HL:
  25.   J.B.l=*(Addr+(R.PC.W++));
  26.   J.B.h=*(Addr+(R.PC.W++));
  27.   M_WRMEM(J.W,R.HL.B.l);J.W++;
  28.   M_WRMEM(J.W,R.HL.B.h);
  29.   break;
  30. case LD_xWORDe_DE:
  31.   J.B.l=*(Addr+(R.PC.W++));
  32.   J.B.h=*(Addr+(R.PC.W++));
  33.   M_WRMEM(J.W,R.DE.B.l);J.W++;
  34.   M_WRMEM(J.W,R.DE.B.h);
  35.   break;
  36. case LD_xWORDe_BC:
  37.   J.B.l=*(Addr+(R.PC.W++));
  38.   J.B.h=*(Addr+(R.PC.W++));
  39.   M_WRMEM(J.W,R.BC.B.l);J.W++;
  40.   M_WRMEM(J.W,R.BC.B.h);
  41.   break;
  42. case LD_xWORDe_SP:
  43.   J.B.l=*(Addr+(R.PC.W++));
  44.   J.B.h=*(Addr+(R.PC.W++));
  45.   M_WRMEM(J.W,R.SP.B.l);J.W++;
  46.   M_WRMEM(J.W,R.SP.B.h);
  47.   break;
  48.  
  49. case LD_HL_xWORDe:
  50.   J.B.l=*(Addr+(R.PC.W++));
  51.   J.B.h=*(Addr+(R.PC.W++));
  52.   R.HL.B.l=*(Addr+(J.W++));
  53.   R.HL.B.h=*(Addr+J.W);
  54.   break;
  55. case LD_DE_xWORDe:
  56.   J.B.l=*(Addr+(R.PC.W++));
  57.   J.B.h=*(Addr+(R.PC.W++));
  58.   R.DE.B.l=*(Addr+(J.W++));
  59.   R.DE.B.h=*(Addr+J.W);
  60.   break;
  61. case LD_BC_xWORDe:
  62.   J.B.l=*(Addr+(R.PC.W++));
  63.   J.B.h=*(Addr+(R.PC.W++));
  64.   R.BC.B.l=*(Addr+(J.W++));
  65.   R.BC.B.h=*(Addr+J.W);
  66.   break;
  67. case LD_SP_xWORDe:
  68.   J.B.l=*(Addr+(R.PC.W++));
  69.   J.B.h=*(Addr+(R.PC.W++));
  70.   R.SP.B.l=*(Addr+(J.W++));
  71.   R.SP.B.h=*(Addr+J.W);
  72.   break;
  73.  
  74. case RRD:
  75.   I=*(Addr+R.HL.W);
  76.   J.B.l=(I>>4)|(R.AF.B.h<<4);
  77.   M_WRMEM(R.HL.W,J.B.l);
  78.   R.AF.B.h=(I&0x0F)|(R.AF.B.h&0xF0);
  79.   R.AF.B.l=(R.AF.B.l&C_FLAG)|(R.AF.B.h? 0:Z_FLAG)|(R.AF.B.h&S_FLAG);
  80.   break;
  81. case RLD:
  82.   I=*(Addr+R.HL.W);
  83.   J.B.l=(I<<4)|(R.AF.B.h&0x0F);
  84.   M_WRMEM(R.HL.W,J.B.l);
  85.   R.AF.B.h=(I>>4)|(R.AF.B.h&0xF0);
  86.   R.AF.B.l=(R.AF.B.l&C_FLAG)|(R.AF.B.h? 0:Z_FLAG)|(R.AF.B.h&S_FLAG);
  87.   break;
  88.  
  89. case LD_A_I:
  90.   R.AF.B.h=R.I;
  91.   R.AF.B.l=(R.AF.B.l&C_FLAG)|(R.AF.B.h? 0:Z_FLAG)|(R.AF.B.h&S_FLAG);
  92.   break;
  93.  
  94. case LD_A_R:
  95. #ifdef INTERRUPTS
  96.   R.AF.B.h=(byte)(-Cnt&0xFF);
  97. #endif
  98.   R.AF.B.l=(R.AF.B.l&C_FLAG)|(R.AF.B.h? 0:Z_FLAG)|(R.AF.B.h&S_FLAG);
  99.   break;
  100.  
  101. case LD_I_A:   R.I=R.AF.B.h;break;
  102. case LD_R_A:   break;
  103.  
  104. case IM_0:     R.IFF&=0xF9;break;
  105. case IM_1:     R.IFF=(R.IFF&0xF9)|2;break;
  106. case IM_2:     R.IFF=(R.IFF&0xF9)|4;break;
  107.  
  108. case RETI:     R.IFF|=0x01;M_RET;break;
  109. case RETN:     R.IFF|=0x01;M_RET;break;
  110.  
  111. case NEG:      I=R.AF.B.h;R.AF.B.h=0;M_SUB(I);break;
  112.  
  113. case LDI:
  114.   I=*(Addr+(R.HL.W++));M_WRMEM(R.DE.W,I);R.DE.W++;R.BC.W--;
  115.   R.AF.B.l=(R.AF.B.l&~(N_FLAG|H_FLAG));
  116.   break;
  117.  
  118. case LDIR:
  119. #ifdef INTERRUPTS
  120.   Cnt=(Cnt>R.BC.W)? Cnt-R.BC.W:1;
  121. #endif
  122.   do
  123.   { I=*(Addr+(R.HL.W++));M_WRMEM(R.DE.W,I);R.DE.W++;R.BC.W--; }
  124.   while(R.BC.W);
  125.   R.AF.B.l&=~(N_FLAG|H_FLAG);break;
  126.  
  127. case LDD:
  128.   I=*(Addr+(R.HL.W--));M_WRMEM(R.DE.W,I);R.DE.W--;R.BC.W--;
  129.   R.AF.B.l=(R.AF.B.l&~(N_FLAG|H_FLAG));
  130.   break;
  131.  
  132. case LDDR:
  133. #ifdef INTERRUPTS
  134.   Cnt=(Cnt>R.BC.W)? Cnt-R.BC.W:1;
  135. #endif
  136.   do
  137.   { I=*(Addr+(R.HL.W--));M_WRMEM(R.DE.W,I);R.DE.W--;R.BC.W--; }
  138.   while(R.BC.W);
  139.   R.AF.B.l&=~(N_FLAG|H_FLAG);break;
  140.  
  141. case CPI:
  142.   I=*(Addr+(R.HL.W++));J.B.l=R.AF.B.h-I;R.BC.W--;
  143.   R.AF.B.l=
  144.     N_FLAG|(R.AF.B.l&C_FLAG)|(J.B.l? 0:Z_FLAG)|(J.B.l&S_FLAG)|
  145.     ((R.AF.B.h^I^J.B.l)&H_FLAG);
  146.   break;
  147.  
  148. case CPIR:
  149.   do
  150.   { I=*(Addr+(R.HL.W++));J.B.l=R.AF.B.h-I;R.BC.W--; }  
  151.   while(R.BC.W&&J.B.l);
  152.   R.AF.B.l=
  153.     N_FLAG|(R.AF.B.l&C_FLAG)|(J.B.l? 0:Z_FLAG)|(J.B.l&S_FLAG)|
  154.     ((R.AF.B.h^I^J.B.l)&H_FLAG);
  155.   break;  
  156.  
  157. case CPD:
  158.   I=*(Addr+(R.HL.W--));J.B.l=R.AF.B.h-I;R.BC.W--;
  159.   R.AF.B.l=
  160.     N_FLAG|(R.AF.B.l&C_FLAG)|(J.B.l? 0:Z_FLAG)|(J.B.l&S_FLAG)|
  161.     ((R.AF.B.h^I^J.B.l)&H_FLAG);
  162.   break;
  163.  
  164. case CPDR:
  165.   do
  166.   { I=*(Addr+(R.HL.W--));J.B.l=R.AF.B.h-I;R.BC.W--; }
  167.   while(R.BC.W&&J.B.l);
  168.   R.AF.B.l=
  169.     N_FLAG|(R.AF.B.l&C_FLAG)|(J.B.l? 0:Z_FLAG)|(J.B.l&S_FLAG)|
  170.     ((R.AF.B.h^I^J.B.l)&H_FLAG);
  171.   break;
  172.